package intfns

import (
	
	
	

	
)

func _string( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	if len() == 1 {
		return tree.String([0].String()), nil
	}

	return tree.String(.NodeSet.String()), nil
}

func concat( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	 := ""

	for ,  := range  {
		 += .String()
	}

	return tree.String(), nil
}

func startsWith( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	return tree.Bool(strings.Index([0].String(), [1].String()) == 0), nil
}

func contains( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	return tree.Bool(strings.Contains([0].String(), [1].String())), nil
}

func substringBefore( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	 := strings.Index([0].String(), [1].String())
	if  == -1 {
		return tree.String(""), nil
	}

	return tree.String([0].String()[:]), nil
}

func substringAfter( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	 := strings.Index([0].String(), [1].String())
	if  == -1 {
		return tree.String(""), nil
	}

	return tree.String([0].String()[+len([1].String()):]), nil
}

func substring( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	 := [0].String()

	,  := round(, [1])
	if  != nil {
		return nil, 
	}

	 := .(tree.Num).Num()

	if float64(-1) >= float64(len()) || math.IsNaN(float64()) {
		return tree.String(""), nil
	}

	if len() == 2 {
		if  <= 1 {
			 = 1
		}

		return tree.String([int()-1:]), nil
	}

	,  := round(, [2])
	if  != nil {
		return nil, 
	}

	 := .(tree.Num).Num()

	if  <= 0 || math.IsNaN(float64()) || (math.IsInf(float64(), 0) && math.IsInf(float64(), 0)) {
		return tree.String(""), nil
	}

	if  <= 1 {
		 =  +  - 1
		 = 1
	}

	if float64(+-1) >= float64(len()) {
		 = tree.Num(len()) -  + 1
	}

	return tree.String([int()-1 : int(+)-1]), nil
}

func stringLength( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	var  string
	if len() == 1 {
		 = [0].String()
	} else {
		 = .NodeSet.String()
	}

	return tree.Num(len()), nil
}

var spaceTrim = regexp.MustCompile(`\s+`)

func normalizeSpace( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	var  string
	if len() == 1 {
		 = [0].String()
	} else {
		 = .NodeSet.String()
	}

	 = strings.TrimSpace()

	return tree.String(spaceTrim.ReplaceAllString(, " ")), nil
}

func translate( tree.Ctx,  ...tree.Result) (tree.Result, error) {
	 := [0].String()
	 := [1].String()
	 := [2].String()

	for  := range  {
		 := ""
		if  < len() {
			 = string([])
		}

		 = strings.Replace(, string([]), , -1)
	}

	return tree.String(), nil
}